package demos;

import java.io.IOException;
import java.lang.ref.*;
import java.util.Random;

public class RefDemo {
    public static void main(String[] args) {
//        testSoft();
//        testWeak();
//        testPhant();
    }

    private static void testPhant() {
        ReferenceQueue<String> que = new ReferenceQueue<>();
        String testObj = "phant";
        // 虚引用
        PhantomReference<String> pobj = new PhantomReference<>(testObj, que);
        testObj = null;
        System.gc();
    }

    private static void testSoft() {
        // OOM之前就会被清理
        // 应用：用来实现内存敏感的缓存，空间有余就保留缓存
        // 空间不足，就清理掉缓存
        SoftReference<Integer> obj = new SoftReference<>(12);
        System.out.println(obj);    // java.lang.ref.SoftReference@7c30a502
        System.out.println(obj.get());  // 12
    }

    private static void testWeak() {
        // 生命周期比弱引用短，每次垃圾回收都会回收弱引用
        // 应用：内存敏感的缓存
        WeakReference<String> wobj = new WeakReference<>("weak");
        System.out.println(wobj);
        System.out.println(wobj.get());
    }
}
